/*******************************************************************************
 * Copyright (C) 2023 DFKI GmbH (https://www.dfki.de/en/web)
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 * SPDX-License-Identifier: MIT
 ******************************************************************************/
{{#info}}
package {{pathsTarget.packageName}}; 

public class {{pathsTarget.className}} {

{{#constants}}
  public static final String SEGMENT_{{nameUpper}} = "{{name}}";
{{/constants}}

  private {{pathsTarget.className}}() {
  }
{{#rootModel}}
{{#primitiveRangeRelations}}
  public static String {{methodName}}() {
    return SEGMENT_{{attributeNameUpper}};
  }

{{/primitiveRangeRelations}}
{{#complexRangeRelations}}
  public static {{modelName}}Path {{methodName}}() {
    return new {{modelName}}Path(SEGMENT_{{attributeNameUpper}});
  }

{{/complexRangeRelations}}
{{/rootModel}}
  public abstract static class SimplePath {

    protected final String path;

    protected SimplePath(String path) {
      this.path = path;
    }

    protected SimplePath(String path, String segment) {
      this(path + "." + segment);
    }

    protected String append(String segment) {
		return path + "." + segment;
    }
    
    @Override
    public String toString() {
      return path;
    }
  }

{{#models}}
  public static final class {{name}}Path extends SimplePath {

{{#singlePathConstructor}}
    private {{.}}Path(String path) {
      super(path);
    }

{{/singlePathConstructor}}
{{#pathAndSegmentConstructor}}
    private {{.}}Path(String path, String segment) {
	  super(path, segment);
	}

{{/pathAndSegmentConstructor}}
{{#subModels}}
    public {{.}}Path as{{.}}() {
      return new {{.}}Path(path);
    }

{{/subModels}}
{{#primitiveRangeRelations}}
    public String {{methodName}}() {
    	return append(SEGMENT_{{attributeNameUpper}});
    }

{{/primitiveRangeRelations}}
{{#complexRangeRelations}}
    public {{modelName}}Path {{methodName}}() {
      return new {{modelName}}Path(path, SEGMENT_{{attributeNameUpper}});
    }

{{/complexRangeRelations}}

  }
{{/models}}
}
{{/info}}